package com.lyrcsoft;

import com.lyrcsoft.exception.MyWebServerException;
import java.util.Map;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

/**
 * 功能描述
 *
 * @author fujc-dev@qq.com
 * @date: 2023年11月01日 11:06
 */

public class LyrcSoftSpringApplication {

    public static void run(Class classz, String[] args) {
        //SpringBoot启动的时候，需要做些什么？

        // 创建一个Spring容器
        AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();
        // 告诉Spring去哪里扫描Bean，SpringBoot默认扫描路径：当前传递给run方式的classz配置类所在的包路径
        webApplicationContext.register(classz);
        webApplicationContext.refresh();
        // 启动一个TOMCAT JEETY，不然怎么接收浏览器的请求呢？
        //startTomcat(webApplicationContext); 为了兼容Tomcat、Jetty等其他Web容器，我们创建了WebServer
        WebServer webServer = getWebServer(webApplicationContext);
        webServer.start();
    }

    private static WebServer getWebServer(WebApplicationContext applicationContext) {
        // 判断是返回TOMCAT还是JETTY容器
        Map<String, WebServer> webServers = applicationContext.getBeansOfType(WebServer.class);
        if (webServers.isEmpty()) {
            throw new MyWebServerException("Web容器未配置");
        }
        if (webServers.size() > 1) {
            throw new MyWebServerException("Web容器配置多个");
        }
        return webServers.values().stream().findFirst().get();
    }

    /**
     * Tomcat也是Java写的，那些启动其他也很方便，我们已经在POM.xml已经配置了Tomcat的依赖
     *
     * <pre>
     *     <dependency>
     *       <groupId>org.apache.tomcat.embed</groupId>
     *       <artifactId>tomcat-embed-core</artifactId>
     *       <version>9.0.46</version>
     *     </dependency>
     * </pre>
     */
    //private static void startTomcat(WebApplicationContext applicationContext) {
    //    // 这段代码其实可以通过Tomcat/conf/server.xml可以看出一些端倪
    //    Tomcat tomcat = new Tomcat();
    //
    //    Server server = tomcat.getServer();
    //    Service service = server.findService("Tomcat");
    //
    //    Connector connector = new Connector();
    //    connector.setPort(8081);
    //
    //    Engine engine = new StandardEngine();
    //    engine.setDefaultHost("localhost");
    //
    //    Host host = new StandardHost();
    //    host.setName("localhost");
    //
    //    String contextPath = "";
    //    Context context = new StandardContext();
    //    context.setPath(contextPath);
    //    context.addLifecycleListener(new Tomcat.FixContextListener());
    //
    //    host.addChild(context);
    //    engine.addChild(host);
    //
    //    service.setContainer(engine);
    //    service.addConnector(connector);
    //
    //    tomcat.addServlet(contextPath, "dispatcher", new DispatcherServlet(applicationContext));
    //    context.addServletMappingDecoded("/*", "dispatcher");
    //
    //    try {
    //        tomcat.start();
    //    } catch (LifecycleException e) {
    //        e.printStackTrace();
    //    }
    //}

}
